#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "../Core/joueur.h"

#include <QtCore/QSignalMapper>
#include <QtGui/QMessageBox>

#include <QtCore/QDebug>

MainWindow::MainWindow(QWidget *parent) :
	QMainWindow(parent),
	ui(new Ui::MainWindow) {
    ui->setupUi(this);
    m_dialogNouvellePartie = NULL;
	m_dialogAbout = NULL;

    // Mise en place du plateau de jeu (graphique)
    m_plateau = new GPlateau(this);
    ui->graphicsView->setScene(m_plateau);

    m_isTopClickable = false;
    m_isBottomClickable = false;

    // Connections des signaux
    connect(ui->actionQuitter, SIGNAL(triggered()), this, SIGNAL(signalQuitter()));
    connect(this, SIGNAL(transmitRefreshCase(int,int)), m_plateau, SLOT(refreshNbGraines(int,int)));
    connect(m_plateau, SIGNAL(signalCaseChoisie(int)), this, SLOT(caseChoisie(int)));
}

MainWindow::~MainWindow() {
    delete ui;
    if (m_dialogNouvellePartie)
        delete m_dialogNouvellePartie;
	delete m_plateau;
}

void MainWindow::on_actionNouvelle_partie_triggered() {
	if (!m_dialogNouvellePartie)
		m_dialogNouvellePartie = new DialogNouvellePartie(this);
    m_dialogNouvellePartie->show();
}

void MainWindow::afficherNouvellePartie(QString pNomJoueur1, Types::TypesJoueurs pTypeJoueur1, QString pNomJoueur2, Types::TypesJoueurs pTypeJoueur2) {
    ui->lbj1->setText(tr("Nombre de graines de %1").arg(pNomJoueur1));
    ui->lbj2->setText(tr("Nombre de graines de %1").arg(pNomJoueur2));
    ui->labelNbGrainesJ1->setText("0");
    ui->labelNbGrainesJ2->setText("0");

    m_joueur1.second = pTypeJoueur1;
	m_joueur2.second = pTypeJoueur2;

    emit nouvellePartie(pNomJoueur1, pTypeJoueur1, pNomJoueur2, pTypeJoueur2);
}

void MainWindow::lancerNouvellePartie(Joueur *j1, Joueur *j2) {
	m_plateau->afficherNouvellePartie(j1->nom(), j2->nom());

    m_joueur1.first = j1;
    m_joueur2.first = j2;

    connect(j1, SIGNAL(saisirCase()), this, SLOT(saisirCase()));
    connect(j2, SIGNAL(saisirCase()), this, SLOT(saisirCase()));
    connect(this, SIGNAL(signalCaseChoisie(int)), j1, SLOT(caseChoisie(int)));
    connect(this, SIGNAL(signalCaseChoisie(int)), j2, SLOT(caseChoisie(int)));

    connect(j1, SIGNAL(grainesPrises(int)), this, SLOT(grainesPrisesJoueur1(int)));
    connect(j2, SIGNAL(grainesPrises(int)), this, SLOT(grainesPrisesJoueur2(int)));
}

void MainWindow::nouveauTour(Joueur *pJoueur) {
    m_joueurActuel = pJoueur;
}

void MainWindow::saisirCase() {
    if (m_joueurActuel == m_joueur1.first) {
        m_isBottomClickable = (m_joueur1.second == Types::Joueur);
        m_isTopClickable = false;
    } else {
        m_isTopClickable = (m_joueur2.second == Types::Joueur);
        m_isBottomClickable = false;
    }
}

void MainWindow::grainesPrisesJoueur1(int pNbGraines) {
    grainesPrises(1, pNbGraines);
}

void MainWindow::grainesPrisesJoueur2(int pNbGraines) {
    grainesPrises(2, pNbGraines);
}

void MainWindow::grainesPrises(int pNumJoueur, int pNbGraines) {
    QLabel* lb;
    switch (pNumJoueur) {
    case 1:
        lb = ui->labelNbGrainesJ1;
        break;
    case 2:
        lb = ui->labelNbGrainesJ2;
        break;
    default:
        lb = NULL;
    }

    if (lb)
        lb->setText(QString::number(lb->text().toInt() + pNbGraines));
}

void MainWindow::caseChoisie(int pNumCase) {
    m_isBottomClickable = false;
    m_isTopClickable = false;
    emit signalCaseChoisie(pNumCase);
}

void MainWindow::partieFinie(Joueur* pGagnant, Joueur* pPerdant) {
	QMessageBox msgBox;
	msgBox.setText(tr("La partie est terminée."));
	msgBox.setInformativeText(tr("Gagnant : %1 avec %2 graines.\nPerdant : %3 avec %4 graines.").arg(pGagnant->nom(), QString::number(pGagnant->nbGraines()), pPerdant->nom(), QString::number(pPerdant->nbGraines())));
	msgBox.exec();
}

void MainWindow::on_actionA_propos_triggered() {
	if (!m_dialogAbout)
		m_dialogAbout = new DialogAbout();
	m_dialogAbout->show();
}
